package pe.edu.unmsm.fisi.sisconteg.view.controller;

import java.util.Date;

import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;

import org.springframework.stereotype.Controller;

import pe.edu.unmsm.fisi.sisconteg.business.service.AlumnoService;
import pe.edu.unmsm.fisi.sisconteg.business.service.EgresadoService;
import pe.edu.unmsm.fisi.sisconteg.business.service.UsuarioService;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Alumno;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Egresado;
import pe.edu.unmsm.fisi.sisconteg.domain.model.Usuario;
import pe.edu.unmsm.fisi.sisconteg.util.UtilsSisconteg;

@ManagedBean
@ViewScoped
@Controller
public class SolicitudAccesoController {

	private String codigoAlumno;
	private String dni;
	private String email;
	private Date fecNacimiento;

	private Alumno alumno;
	private Usuario usuario;

	@Resource
	private AlumnoService alumnoService;

	@Resource
	private UsuarioService usuarioService;

	@Resource
	private EgresadoService egresadoService;

	public SolicitudAccesoController() {
	}

	public void validarUsuarioExistente(AjaxBehaviorEvent actionEvent) {
		if (usuarioService.obtenerUsuarioxNick(codigoAlumno) != null) {
			String mensaje = String
					.format("El usuario con codigo %s ya se encuentra registrado en el sistema",
							codigoAlumno);
			FacesMessage facesMessage = new FacesMessage(
					FacesMessage.SEVERITY_INFO, mensaje, mensaje);
			FacesContext.getCurrentInstance().addMessage(null, facesMessage);
		}
	}

	public String solicitarAccesoAction() {
		String mensaje;
		FacesMessage facesMessage;
		String resultNavegacion = null;
		if (usuarioService.obtenerUsuarioxNick(codigoAlumno) != null) {
			mensaje = String
					.format("El usuario con codigo %s ya se encuentra registrado en el sistema",
							codigoAlumno);
			facesMessage = new FacesMessage(FacesMessage.SEVERITY_INFO,
					mensaje, mensaje);
			FacesContext.getCurrentInstance().addMessage(null, facesMessage);

		} else {
			alumno = alumnoService.validarDatos(codigoAlumno, dni);
			if (alumno == null) { // los datos no son validos
				mensaje = "DATOS NO VALIDOS";
				facesMessage = new FacesMessage(FacesMessage.SEVERITY_INFO,
						mensaje,
						"Los datos ingresados no concuerdan. Por favor verifique sus datos");
				FacesContext.getCurrentInstance()
						.addMessage(null, facesMessage);
			} else {
				// Ingresar un nuevo Usuario a la tabla Usuario con
				// nick:codigo alumno
				// pwd:codigo alumno
				// email: el email k me dio
				// perfil: 0
				// valido: false --> este se cambia a true cuando accede por
				// primera vez al sistema
				// id_egresado: null - se actualiza cuando accede por primera
				// vez

				usuario = new Usuario();
				usuario.setNickUsuario(codigoAlumno);
				usuario.setPwdUsuario(UtilsSisconteg.generarContrasenias(12));
				usuario.setEmail(email);
				usuario.setPerfil(UtilsSisconteg.ROL_EGRESADO);
				usuario.setValido(false);
				Egresado egresado = egresadoService
						.getEgresadoxCodigoAlumno(codigoAlumno);
				if (egresado == null) { // se crea el egresado
					egresado = new Egresado();
					egresado.setAlumno(alumno);
					egresado.setDni(dni);
					egresado.setAnioEgreso(null);
					egresado.setEmailEgresado(email);
					egresado.setSexo(null);
					egresado.setTelefono(null);

					egresadoService.crearEgresado(egresado);
				}

				// usuario.setEgresado(egresadoService.getEgresadoxCodigoAlumno(codigoAlumno));

				usuario.setEgresado(egresado);

				usuarioService.crearUsuario(usuario);

				mensaje = String
						.format("Bienvenido al sistema SISCONTEG, %s %s<br />"
								+ "Su usuario es: %s<br />Su contraseña es: %s",
								alumno.getNombres(), alumno.getApPaterno(),
								usuario.getNickUsuario(),
								usuario.getPwdUsuario());

				usuario = null;
				FacesContext.getCurrentInstance().getExternalContext()
						.getRequestMap().put("msgSolicitudAcceso", mensaje);

				resultNavegacion = "mensajeSolicitudAcceso.jsf";
			}
		}
		return resultNavegacion;
	}

	public String getCodigoAlumno() {
		return codigoAlumno;
	}

	public void setCodigoAlumno(String codigoAlumno) {
		this.codigoAlumno = codigoAlumno;
	}

	public String getDni() {
		return dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getFecNacimiento() {
		return fecNacimiento;
	}

	public void setFecNacimiento(Date fecNacimiento) {
		this.fecNacimiento = fecNacimiento;
	}

	public Alumno getAlumno() {
		return alumno;
	}

	public void setAlumno(Alumno alumno) {
		this.alumno = alumno;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
}
